/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package edu.uoc.tfc.exuoc.vistes;

import edu.uoc.tfc.exuoc.config.Config;

import edu.uoc.tfc.exuoc.controladors.AbstractInGestor;
import edu.uoc.tfc.exuoc.controladors.GestorUsuaris;
import edu.uoc.tfc.exuoc.controladors.GestorGrups;
import edu.uoc.tfc.exuoc.errors.AfegirDAOException;
import edu.uoc.tfc.exuoc.errors.BuitException;
import edu.uoc.tfc.exuoc.errors.NoExisteixException;
import edu.uoc.tfc.exuoc.errors.ExisteixException;
import edu.uoc.tfc.exuoc.utils.Eines;
import edu.uoc.tfc.exuoc.utils.seguretat.InjeccioCodi;

import edu.uoc.tfc.exuoc.model.Usuari;
import edu.uoc.tfc.exuoc.model.Grup;

import edu.uoc.tfc.exuoc.consultes.UsuariLlistat;

import java.util.List;
import java.util.ArrayList;
import java.util.Iterator;

import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;

//import java.util.logging.Level;
//import java.util.logging.Logger;
import org.hibernate.HibernateException;



/**
 * @author Emili A. Moreno
 * @data 03/12/2011
 * @description classe d'struts per les gestió dels usuaris
 */
public class IGestorUsuaris extends AbstractInGestor
            implements  ModelDriven<Usuari>{

    //Entitat gestionada
    private Usuari usuari=null;
    private Long idUsuariActual=Config.valorNull;
    //private GestorUsuaris gu;
    private GestorUsuaris guI=null;

    //Valor de formulari que servirà per verificar la contrasenya
    private String verificarcontrasenya=Config.valorNullStr;


    //Logs
   
    private int usuarisPerPagina=Config.USUARI_PAGE*2-2;

    private List<UsuariLlistat> llistaUsu = new ArrayList<UsuariLlistat>();
    private int nUsuaris=0;
    //Per crear la llista de grups
    private Iterator<Grup> llistaGrups= null;

    private int pos=0;

    

    // public IGestorUsuaris(){
    //     this.openGestor();
    //}

    @Override
    public Usuari getModel() {
        return usuari;
    }


    public void setIdUsuariActual(Long idUsu){
        this.idUsuariActual=idUsu;
    }
    public Long getIdUsuariActual(){
        return idUsuariActual;
    }
  public String getVerificarcontrasenya() {
        return verificarcontrasenya;
    }

    public void setVerificarcontrasenya(String verificarcontrasenya) {
        this.verificarcontrasenya = verificarcontrasenya;
    }

    public Iterator<Grup> getLlistaGrups() {
        return llistaGrups;
    }

    public void setLlistaGrups(Iterator<Grup> llistaGrup) {
        this.llistaGrups = llistaGrup;
    }


    @Override
    public void prepare() {

        //Actualitzem la data de la sessió per l'usuari i assignem a idSessio
        //la sessió que li correspon.
        super.prepare();
        this.openGestor();
        if (this.getLlistaGrups()==null){
            omplirllistatGrups();
        }
       
        try {
            if (this.idUsuariActual.equals(Config.valorNull) ||
                this.idUsuariActual.equals(null)){
                usuari= new Usuari();

            }else{
                try {
                    usuari=GestorUsuaris.getInstance().llegir(idUsuariActual);
                }catch(NoExisteixException e) {
                 this.getLog().error("prepare: No existeix. usuari id: "+this.idUsuariActual);
                }
                // si no s'ha trobat l'usuari es guarda un avís
                if (usuari==null){
                    this.getLog().error("Prepare: Usuari no trobat id: "+this.idUsuariActual);
                    usuari=new Usuari();
                }/*else{
                    this.getLog().info("prepare:  usuari="+usuari.toString());
                }*/
            }
        }catch (NullPointerException e){
            if (this.usuari!=null)this.getLog().error("Algun valor null, Usuari:"+usuari.toString());
        }

        //this.closeGestor();
    }
 


    public int getUsuarisPerPagina() {
        return this.usuarisPerPagina; //Config.USUARI_PAGE;
    }

    public void setUsuarisPerPagina(int usuarisPerPagina) {
        this.usuarisPerPagina = usuarisPerPagina;
    }

    public int getPos() {
        return pos;
    }

    //Es filtra ja que és un valor que es pot passar com a paràmetre a l'URL
    public void setPos(int pos) {
        InjeccioCodi filtre=new InjeccioCodi();
        this.pos = Integer.parseInt(filtre.netejar(pos));
    }

    public void setNUsuaris(int _nUsuaris) {
        this.nUsuaris = _nUsuaris;
    }


    public void setLlistaUsu(List<UsuariLlistat> _llistaUsu) {
        this.llistaUsu = _llistaUsu;
    }


    public List<UsuariLlistat> getLlistaUsu() {
        return llistaUsu;
    }


    public int getNUsuaris() {

        return this.nUsuaris;
    }

     /**
     *  Crea una instància cap al Gestor de Contenidors si no existeix encara
     */
    private void openGestor(){

        //if (this.gu==null)
        //    gu=new GestorUsuaris();
        guI=GestorUsuaris.getInstance();
    }
    
    private void closeGestor(){
        try{
            guI.tancar();
            guI=null;
        }catch(HibernateException e){
            getLog().error("Hi ha hagut un error realitzant el tancament del Gestor ", e.getLocalizedMessage());
        }catch (NullPointerException e){
            this.getLog().info("Gestor d'usuaris ja tancat");
        }
    }


    //En tancar la classe es tanquen les connexions creades
  /*
   13/11/2011:Emili: Comentat , si cal s'activarà més endavant
   @Override
    protected void finalize() throws Throwable {

        try {
            this.closeGestor();
        } catch(Exception e) {
            this.getLogexuoc().error("Error tancant la classe Gestora");
        }finally {
            super.finalize();
        }
    }
*/

    /**
     *  Genera la llista de grups, LlistaGrups, per l'edició d'un usuari
     */
    private void omplirllistatGrups(){
        Iterator<Grup> ll;

        try {
            GestorGrups gg = new GestorGrups();
            //Obtenir la llista de grups
            ll=gg.llistat();
            this.setLlistaGrups(ll);
            ll=null;
            gg.tancar();

        }catch(NullPointerException e){
            this.getLog().error("Error obtenint la llista de grups. {}"
                    ,e.getLocalizedMessage());
        }catch(BuitException e){
            this.getLog().error("Error d`accés a la llista de grups. {}"
                    ,e.getLocalizedMessage());
        }       
    }

    private List<UsuariLlistat> omplirLlistaUsuaris(int ini, int fi){

        Iterator <Usuari> ll=null;
        List<UsuariLlistat> llista = new ArrayList<UsuariLlistat>();

        try {
            //Comprovació de rangs
            if (ini < 0) ini=0;
            //getLog().info("OmplirLlistausuaris");
            ll=guI.llistat(ini, fi);
            while (ll.hasNext()){

                //getLog().info("OmplirLlistausuaris:dintre while:");
                Usuari usu=(Usuari)ll.next();
                llista.add(new UsuariLlistat(usu.getActiu(),usu.getId(),usu.getLogin(), usu.getDataalta(), usu.getNom()+" "+usu.getCognoms(),usu.getGrup().getNom() ));
            }
        }catch (HibernateException ex) {
                this.getLog().error("no s'ha pogut obtenir el nombre de contenidors",ex.getLocalizedMessage());
            
        //}catch (LlistatDAOException ex) {
        }catch (BuitException ex) {
                this.getLog().error("Error: Llistat. ",ex.getLocalizedMessage());
        }catch (IndexOutOfBoundsException ex) {
                this.getLog().error("Error: La llista de contenidors es troba fora de rang ",ex.getMessage());
        }
        //19-12_1:ll=null;
        return llista;
    }


 /**    S'obté la llista d'elements
  *
 *
 * @return nombre d'elements  Contenidors (Classe)
 */
    //TODO:23-11-11:Emili: Caldria fer una interficie per tots els gestors
    private int quants(Class obj){
        int num=Config.valorNullInt;
        String classeNom=obj.getSimpleName();

        try {
            num = guI.num();
            //this.closeGestor();
        } catch (HibernateException ex) {
            String[] llista ={obj.getSimpleName(),ex.getLocalizedMessage()};
            this.getLog().error("no s'ha pogut obtenir el nombre d'elements ,Classe :{}. {}",llista);
        }catch(BuitException e){
            this.getLog().error("llista buida. Classe :"+obj.getSimpleName(),e.getLocalizedMessage());
        }catch(NullPointerException e){
            this.getLog().error("IGU:quants():nombre d'usuaris Null:"+obj.getSimpleName());
        }
        return num;
    }

    //Action per l'edició d'usuaris, es basa en el mètode afegir()
    public String editar(){

        return this.afegir();//ActionSupport.INPUT;
    }

    /**
     * Action per afegir usuaris nous
     * El mètode preparable és l'encarregat de recuperar les dades de l'usuari
     * cas de que es passi un idUsuariActual
     *
     * @return Accés al formulari d'edició
     */
    public String afegir(){
        this.openGestor();
        //
        //Recuperem els grups
        //this.omplirllistatGrups();
        //19-12_1:Emili:this.closeGestor();
        return ActionSupport.INPUT;
    }


    /**Actualiza la llista d'usuaris de LlistaUsu
     *
     * @return Struts
     */
    public String llistat() {
        try{
            this.openGestor();
            this.setNUsuaris(this.quants(Usuari.class));
            this.setLlistaUsu(
                    this.omplirLlistaUsuaris( this.getPos(),
                    this.getPos()+this.getUsuarisPerPagina()));
        }catch(NullPointerException e){
            this.getLog().error("Llistat().Error obtenint la llista d'usuaris. {}",e.getLocalizedMessage());
        }

        //19-12_1:Emili: this.closeGestor();
        return ActionSupport.SUCCESS;
    }

    

    public String consulta(){
        Usuari usu=null;
        try {


            //Recuperem els grups
            this.omplirllistatGrups();

            //Obtenir dades de l'ususari
            //17:12:2011:auixò ho fa el prepare: usu=gu.llegir(idUsuariActual);

            //19-12_1:Emili:this.closeGestor();
        }catch(NullPointerException e){
            this.getLog().error("consulta: Error obtenint les dades de l'usuari. id: "+
                    this.getIdUsuariActual()+" ",e.getLocalizedMessage());

        }/*catch (NoExisteixException ex) {
                this.getLog().error("consulta:No existeix l'usuari amb id:"+
                        idUsuariActual+". ",ex.getLocalizedMessage());
        }*/
        return ActionSupport.SUCCESS;
    }


    /**
     * Mètode que té com a funció gestionar les dades rebudes pels formularis
     * d'alta/modificació d'usuaris.
     * @return
     */
    public String editarForm(){
        String stat=Config.CORRECTE;

        try {

            this.openGestor();
             
            // tenim una insercio o modificacio ?

/*            this.getLog().info("usu nou:"+this.getModel().toString()
                    +","+this.getModel().getContrasenya()+","+this.getModel().getEmail()
                    +","+this.getModel().getDatabaixa()+","+this.getModel().getAdress()
                    +","+this.getModel().getTelf()+","+this.getModel().getNaixament()
                    +","+this.getModel().getGrup().getNom());
 * 
 */
            if (this.getModel().getId()!=Config.valorNull){
                
                //MODIFICACIÓ
                addActionMessage("Modificació Usuari :"+this.getModel().toString());

                Usuari usu=guI.modificar(usuari);
                addActionMessage("usuari modificat, id: "+this.getIdUsuariActual());
               //19-12_4: usuari=null;
                
            }else {

                //INSERCIÓ
                Long idUsu=Config.valorNull;
                //this.getLog().info("1: "+this.getModel().getContrasenya());
                //this.getLog().info("2: "+this.getVerificarcontrasenya());
                //Es verifica la contrassenya
                if (this.getModel().getContrasenya()
                        .equals(this.getVerificarcontrasenya())){

                    idUsu=guI.afegir(this.getModel());
                    //Tenim un ident. correcte?
                    if (idUsu <0 ){
                        this.getLog().error("EditForm:Hi ha hagut un error "
                              +"afegint l'usuari. valor retornat:"+idUsu);
                            stat=ActionSupport.ERROR;
                            this.addActionError("Usuari no afegit/modif.");
                            this.closeGestor();
                        //19-12_4:Emili throw new
                           //AfegirDAOException("EditForm:No es pot afegir/modif "
                            //+"l'usuari:  "+this.getModel().getLogin());
                        this.getLog().error("EditForm:Hi ha hagut un error afegint"
                                +"l'usuari. valor retornat:"+idUsu);

                    }
                    addActionMessage("Afegir Usuari nou:"+this.getModel().toString());
                    addActionMessage("Usuari afegit, id: " +idUsu.toString());

                }else{
                    //Les contrassenyes no són iguals, es torna al form  INPUT
                    this.getLog()
                         .info("EditForm:les contrasenyes no són iguals.Usuari:"
                         +this.getModel().getLogin());
                    this.addActionError("Verificació de contrasenya incorrecte");
                    stat=ActionSupport.INPUT;
                }
            }

        }catch (AfegirDAOException ex) {
            this.getLog().error("EditForm:La base de dades informa d'un error en l'entrada de l'usuari. "+ex.getLocalizedMessage() );
            this.addActionError("usuari no afegit. Problemes amb l'accés a dades");
            stat=ActionSupport.ERROR;

        }catch (BuitException ex) {
            this.getLog().error("EditForm:Hi ha hagut un error realitzant la modificació de l'usuari"+ex.getLocalizedMessage());
            this.addActionError("EditForm:usuari buit");
            stat=ActionSupport.ERROR;

        }catch (NullPointerException e){
            this.getLog().error("EditForm:Valor null trobat "+e.getMessage());
            this.addActionError("EditForm:s'ha provat d'utilitzar un valor null");
            stat=ActionSupport.ERROR;
        }catch (NoExisteixException e ){
            this.getLog().error("EditForm:No s'ha trobat el grup a on afegir l'usuari. "+ e.getMessage());
            this.addActionError("EditForm:usuari no existeix");
            stat=ActionSupport.ERROR;
        }catch (ExisteixException e ){
            this.getLog().error("EditForm:S'ha trobat un elment repetit."+ e.getMessage());
            stat=ActionSupport.ERROR;
        }
        //19-12_1:Emili:this.closeGestor();
        return stat;
    }

    public String eliminar(){
        String stat="llistatUsuaris";

        if (this.getIdUsuariActual()!=null){
            stat=Config.CORRECTE;
            this.openGestor();
            try{

                Usuari u=guI.llegir(this.getIdUsuariActual());
                //this.getLog().info("IdUsuariActual: "+this.getIdUsuariActual());
                //this.getLog().info("Usuari: "+u);
                if (u != null){
                    guI.eliminar(usuari);
                    addActionMessage("Usuari eliminat : " +this.usuari.getLogin().toString());
                    usuari=null;

                }else  throw new BuitException("Usuari no trobat");

            }catch (NoExisteixException e){
                this.getLog().error("Usuari no exiteix. id: "+this.getIdUsuariActual(), e.getMessage());
                this.addActionError("Usuari no eliminat, id:"+this.getIdUsuariActual());
                this.addActionError(e.getMessage());
                stat=ActionSupport.ERROR;

            }catch (IllegalArgumentException e){
                this.getLog().error("El paràmetre indicat no és correcte: "+this.getIdUsuariActual(), e.getMessage());
                this.addActionError("Usuari no eliminat, id:"+this.getIdUsuariActual());
                this.addActionError(e.getMessage());
                stat=ActionSupport.ERROR;

            }catch (BuitException e){
               this.getLog().error("S'ha produit un error eliminant l'usuari:",e.getMessage());
                this.addActionError("Usuari no eliminat, id:"+this.getIdUsuariActual());
                this.addActionError(e.getMessage());
                stat=ActionSupport.ERROR;
            }catch (NullPointerException e){
                this.getLog().error("Valor null trobat ", e.getLocalizedMessage());
                stat=ActionSupport.ERROR;
            }

            //19-12_1:Emili:this.closeGestor();
        }

       //1 gc.tancar();
        return stat;
    }
/**
 * TESTS
 */
private void testModificarUsuari(){
    Usuari u1=null,u2=null,u3=null;
        try {
            this.openGestor();
            u1=this.guI.llegir(1L);
            Eines.escriu(u1);
            u1.setNom("nou");//      u1.getNom().concat("_nou"));
            u1.setLogin(String.valueOf(new java.util.Random().nextLong()).substring(0,7));
            Eines.escriu("usuari abans de la persistència:"+u1);

            u2=this.guI.modificar(u1);
            if (u2.getId().equals(Config.valorNull))
                throw new NoExisteixException("No existeix l'usuari");
            u3=this.guI.llegir(u2.getId());
            Eines.escriu("usuari després de la persistència:"+u3);
        } catch (NoExisteixException ex) {
            this.getLog().error("Error llegint les dades: "+ex.getLocalizedMessage());
        }/*catch (ModDAOException ex) {
                ig.getLog().error("Error modifcant les dades: "+ex.getLocalizedMessage());

        }*/catch (BuitException ex) {
            this.getLog().error("NO existeix l'usuari: "+ex.getLocalizedMessage());
        }catch (NullPointerException e){
           Eines.escriu("ERROR:"+e.getLocalizedMessage());
        }
    this.closeGestor();
}
 
 /**
  *
  * MAIN
  */
    public static void main(String[] args){
        IGestorUsuaris ig=new IGestorUsuaris();


        //ig.testModificarUsuari();
        ig.setIdUsuariActual(1L);
        ig.openGestor();
       /* ig.llistat();
        Iterator<UsuariLlistat> it=ig.getLlistaUsu().iterator();
        while (it.hasNext()){
            UsuariLlistat usu=it.next();
            Eines.escriu(usu.getId()+": "+usu.getLogin()+":"+usu.getNomComplet());
        }
        *
        */
        //try {
            //Usuari usu= ig.gu.llegir(1L);
            //Eines.escriu(usu.toString());
            ig.prepare();
            Eines.escriu("Llistat(): "+ig.llistat());
             Iterator<UsuariLlistat> it=ig.getLlistaUsu().iterator();
            while (it.hasNext()){
                UsuariLlistat u=it.next();
                Eines.escriu(u.getId()+": "+u.getLogin()+":"+u.getNomComplet()+":"+u.getActiu()+":"+u.getDataalta());
            }
            Eines.escriu("Nombre getNUsuaris(): "+ig.getNUsuaris());
            ig.openGestor();



/*        }catch(NoExisteixException e){
            ig.getLog().error("Usuari no existeix");

        }*/
        //Eines.escriu(ig.getLlistaUsu());
        Eines.escriu("Quants:"+ig.quants(Usuari.class));

        Eines.escriu("nombre d'usuaris: "+ig.getNUsuaris());
        //Eines.escriu(ip.llistaUltimsItems.iterator().next().getNom());
        //Eines.escriu(ip.llistaContenidors.iterator().next().getNom());
       
       ig.closeGestor();
        
    }



}

